home *** CD-ROM | disk | FTP | other *** search
/ Merciful 2 / Merciful - Disc 2.iso / software / a / alliancedoc's09.dms / alliancedoc's09.adf / aachip.txt.pp / aachip.txt
Text File  |  1992-08-08  |  32KB  |  887 lines

  1.                           Ensuring Compatibility
  2.                with Next Generation Amiga Graphics Hardware
  3.  
  4.      Copyright (c) 1991-1992 Commodore International Services Corporation
  5.                            All Rights Reserved.
  6.  
  7.               CONFIDENTIAL AND PRELIMINARY
  8.  
  9. NOTE - This document contains a great deal of information to help
  10. you remain compatible with and take advantage of V39 and future chips.
  11. Please also consult all current readmes and release notes for the latest
  12. information on current implementations and features.
  13.  
  14. Do NOT distribute this information.  This information may only be
  15. discussed in Commodore's closed developer conferences, and only
  16. if Commodore opens a topic for discussion.
  17.  
  18.  
  19. CONFIDENTIAL - The information contained herein is confidential and
  20. proprietary.  This information is provided under non-disclosure
  21. for inhouse use only by registered Amiga developers.
  22.  
  23. PRELIMINARY - The information contained herein is preliminary.
  24.  
  25. WARNING - The information contained herein is subject to change without
  26. notice.  Commodore specifically does not make any endorsement or
  27. representation with respect to use, results, or performance of the
  28. information (including without limitations its capabilities,
  29. appropriateness, reliability, currentness, or availability).
  30.  
  31. DISCLAIMER - This information is provided "as is" without warranty of any
  32. kind, either express or implied. The entire risk as to the use of this
  33. information is assumed by the user.  In no event will Commodore or its
  34. affiliated companies be liable for any damages, direct, incidental, special
  35. or consequential, resulting from any defect in the information, even if
  36. advised of the possibilities of such damages.
  37.  
  38.                 Table of Contents
  39.  
  40.  
  41.         Introduction/Purpose
  42.  
  43.         New Hardware Features
  44.  
  45.         Ensuring Compatibility
  46.  
  47.         Known No-Nos     
  48.  
  49.         Taking Advantage of New Features
  50.  
  51.         What to Expect From New Software
  52.  
  53.         Table: New Modes
  54.  
  55.  
  56. Introduction/Purpose
  57.  
  58.  
  59. The capabilities of the built-in Amiga graphics hardware had not changed
  60. significantly between the introduction of the Amiga 1000 in 1985 and the
  61. release of the Amiga 3000 in 1990.  The ECS chipset and the display
  62. enhancer added several new graphics modes and increased the functionality
  63. of existing modes -- yet the market demands more.
  64.  
  65. Commodore is working on a graphics chipset which will include many
  66. substantial new features.
  67.  
  68. This document explains the features of this next generation Amiga graphics
  69. hardware, and ways to ensure application compatibility with these features.
  70.  
  71. Additionally, coding methods are outlined which will allow current software
  72. to automatically exploit some of the new features.
  73.  
  74. Finally, so that developers can begin "sketching out" applications that
  75. will support the new chipset, a brief overview of some of the relevant
  76. planned system software changes is provided.
  77.  
  78. New Hardware Features
  79.  
  80. This is a summary of the new Amiga graphics hardware's features.
  81.  
  82. Enhanced Bandwidth - A 32 bit wide data bus allows doubling of memory
  83. bandwidth (to 2x the normal bandwidth) and supports the input of 32 bit
  84. wide bitplane and sprite data.  Bandwidth may be doubled again (to 4x) by
  85. using Fast Page Mode RAM.
  86.  
  87. More Bitplanes - The maximum number of bitplanes has increased to 8 in all
  88. resolution modes.  This translates to a 256 entry color table for each
  89. available mode.
  90.  
  91. Enhanced Dual Playfield Support - Each playfield may now have up to 4
  92. bitplanes.  The bank of 16 colors in the 256 color table is independently
  93. selectable for each playfield.
  94.  
  95. Larger Palette - Each entry in the color table may now be 25 bits wide (8
  96. bits each for Red, Blue, and Green data -- plus 1 bit for genlock
  97. information).  This translates to a palette of 16,777,216 colors.
  98.  
  99. Enhanced Sprite Support - Sprite resolution can be set to lores, hires, or
  100. super-hires, independent of screen resolution.  Attached sprites are now
  101. available in all modes.  However, some new higher bandwidth modes may
  102. only allow one sprite.  Odd and even sprites may use their own independent
  103. 16 color bank from the 256 color table.  Old format sprites may still be 16
  104. bits wide, and new format sprites may be 32 or 64 bits wide.  Sprites may
  105. now optionally appear in the border region.  The horizontal positioning
  106. resolution of sprites has increased to 35ns (equivalent to super-hires
  107. pixel widths.)
  108.  
  109. Enhanced hardware scrolling support - Two extra bits allow seamless
  110. scrolling of up to 64 bit wide bitplanes in all resolutions.  The
  111. resolution of bitplane scrolling has been increased to 35ns.
  112.  
  113. Hardware scan doubling support - 15khz bitplanes and sprites may now be
  114. scan doubled for flicker free display on 31khz monitors, and for enhanced
  115. display sharing with 31khz bitplanes.
  116.  
  117. ECS compatibility - New chips will power-up in an ECS compatibility mode,
  118. which will allow many older self-booting programs to be run on new machines.
  119.  
  120.  
  121. Ensuring Compatibility
  122.  
  123. This section covers programming techniques which will help ensure that an
  124. application will work as expected when running on systems that use next
  125. generation graphics hardware.
  126.  
  127. The most important thing to remember about maintaining compatibility (and
  128. this applies to all software-hardware issues) is to never access the
  129. hardware directly.  As a few developers learned when users tried to run
  130. their applications on the Amiga 3000, hardware does change, and the correct
  131. way to access it is through the system software.  When the hardware is
  132. changed, the system software changes with it, and old programs that use the
  133. new software have a better chance of running properly.
  134.  
  135. An important issue here is that you should use the current system software.
  136. Applications should be written to run under release 2.0 of the operating
  137. system,  as it will be the basis for all new hardware support, and release
  138. 1.3 cannot open the new modes.
  139.  
  140. One of the main reasons that 2.0 will be a minimum requirement is the
  141. Display Database.  Starting with the ECS chipset, not all machines have all
  142. display modes.  This will be even more true in the future.  The only way to
  143. know if a particular mode is available is to check the Display Database.
  144.  
  145. For a detailed explanation of how to properly open a screen using the
  146. Display Database information to check for available modes, see the
  147. AmigaMail Volume Two articles entitled "An Introduction to V36 Screens and
  148. Windows" (page IV-3) and "Opening Screens and Windows on Any Amiga" (Page
  149. IV-17).  Some of the pertinent details can also be found in the Paris
  150. DevCon notes article entitled "Monitors, Modes, and the Display Database."
  151.  
  152. Once a screen has been opened, manipulating that screen should also be
  153. handled using system calls.
  154.  
  155. In particular, these manipulations must be handled by the system software:
  156.  
  157.     allocation of graphics resources - Use graphics.library
  158.  
  159.     palette manipulation - Use graphics.library
  160.  
  161.     sprite manipulation - Use graphics.library
  162.  
  163.     manipulating icons - use icon.library
  164.  
  165.     allocating & changing colormaps & colortables - use graphics.library
  166.  
  167.     bitplane allocations - use AllocRaster(), but please refer to the next
  168. section for important information about limitations of AllocRaster() which
  169. will require a new and different function to be called.
  170.  
  171. Furthermore, these manipulations should be handled by the system software
  172. whenever possible:
  173.  
  174.     drawing operations - Use graphics.library and intuition.library
  175.  
  176.     blitter operations - Use Blt[BitMap, RastPort, etc.] functions & macros
  177. (from graphics.library.)  REMEMBER -- When using the blitter directly,
  178. ALWAYS use the system's WaitBlit() function instead of your own.  The
  179. system knows about and handles problems with the BLITTER_DONE signal that
  180. different revisions of the Agnus chip have.
  181.  
  182. Remember that the internals of system structures are subject to change or
  183. extension.  For new graphics hardware, structures likely to be extended
  184. those associated with ColorMaps, ViewPortExtras, Sprites, and many others. 
  185. To deal with the "shifting sands" of system structures, developers should
  186. use system calls to allocate, create, and manipulate these structures.  For
  187. example, pre-V39 applications should always use InitBitMap to properly
  188. initialize a BitMap structure.  Applications that support V39 should
  189. use the new AllocBitMap() call to handle both allocation and initialization.
  190. Even structures that may not change should still be accessed with system
  191. calls, because their contents may be calculated in different ways.
  192. If an allocation call is available, use it.  If an initialization
  193. call is available, use it.  See the V39 graphics.doc autodoc for
  194. specifications of new functions such as AllocBitMap().
  195.  
  196. Not all system structures have "Get" and "Set" calls, but developers need
  197. to use the ones that do exist.  For example, it is better to use
  198. "SetAPen(myRastPort,n)" instead of "myRastPort->FgPen=n; SetDrMd()".
  199. Many additional Set and Get functions are provided in V39.  For upwards
  200. compatibility, use always the Set and Get functions when available.
  201.  
  202. A note about hardware -- the new chips will power-up in an ECS compatible
  203. state, which will allow a large portion of older, self-booting (read -
  204. "games") software to run even though the hardware is hit hard by such code.
  205. However, any software which is expects to be run after the operating system
  206. has been started will need to be very careful with the hardware.
  207.  
  208. Once again:  IF SOFTWARE DEPENDS ON HARDWARE AND THE HARDWARE CHANGES, THEN
  209. THE SOFTWARE WILL LIKELY BREAK.  It is much better for the software to
  210. depend on the system software, which will be made to work with the new
  211. hardware.  While some efforts are made to allow older hardware-banging code
  212. to function with new hardware, not everything can or will be compatible. 
  213. You have been warned.  With this in mind, for those developers who (for
  214. whatever reason) absolutely insist on using hardware directly, remember
  215. these points. (Paraphrased from the Amiga Hardware Reference Manual)
  216.  
  217.     Applications must not write spurious data to, or interpret data from,
  218. currently unused bits or addresses.
  219.  
  220.     Applications must set undefined bits to zero for writes and ignore them
  221. for reads.
  222.  
  223. Play it safe -- when reading, mask out ALL the bits EXCEPT the ones you're
  224. actually interested in.
  225.  
  226.  
  227. Known No-Nos
  228.  
  229. This short list represents some known coding strategies that will cause
  230. software to function incorrectly on new hardware.
  231.  
  232.     * Incorrect allocation of BitMap planes:
  233.  
  234.     This problem surfaces because the new chips have an increased fetch
  235. bandwidth.  Bitplane data must be properly aligned in CHIP memory for this
  236. feature to work.
  237.  
  238. Wrong -
  239.  
  240. for(planenum=0; planenum<DEPTH; planenum++)
  241.  
  242.     bitmap.Planes[planenum]=(PLANEPTR)AllocMem(RASSIZE(width,height),MEMF_CHIP);
  243.  
  244.  
  245. Wrong -
  246.  
  247. allplanes=AllocMem(DEPTH*RASSIZE(width,height),MEMF_CHIP);
  248.  
  249.  
  250. Instead, current software should call the graphics.library AllocRaster()
  251. function to reserve space for BitMap planes.  Unfortunately,  AllocRaster
  252. will not be able to automatically align bitmap planes unless they are a
  253. multiple of 32 (for 2x bandwidth modes) or 64 (for 4x bandwidth modes.)
  254. The new V39 graphics function AllocBitMap() properly handles all
  255. such allocation issues.  OpenScreenTags (intuition) uses AllocBitMap()
  256. under V39.
  257.  
  258. Correct V39 method for allocating rasters -
  259.  
  260. This method will allow you to get the greater bandwidth, more efficient,
  261. displays under V39 in a manner that should be upwards-compatible with
  262. future enhancements:
  263.  
  264.     Use graphics function:     AllocBitMap()
  265.     OR  Use intuition function:    OpenScreenTags()
  266.  
  267.  
  268.  
  269. The following pre-V39 compatible AllocRaster should also be usable
  270. to get higher bandwidth displays (no guarantees - we suggest you
  271. conditionally code to use AllocBitmap() for future compatibility):
  272.  
  273. /* Certain modes REQUIRE 2x or 4x bandwidth.
  274. When using AllocRaster(), the only way to be sure that bitplane memory
  275. will be properly aligned is to make the WIDTH of the raster a multiple
  276. of 64 for 4x modes and a multiple of 32 for 2x modes.
  277. V39 may be able to provide greater bandwidth for rasters allocated
  278. this way: */
  279.  
  280. width = (some multiple of 64);
  281.  
  282. for(planenum=0; planenum<DEPTH; planenum++)
  283.     bitmap.Planes[planenum]=(PLANEPTR)AllocRaster(width,height);
  284.  
  285.  
  286.  
  287. * Incorrect assumptions BitMap->BytesPerRow:
  288.  
  289. Applications that use the supplied system functions to initialize and
  290. allocate BitMaps and their elements should be aware that the value of
  291. BitMap->BytesPerRow may be different from the expected value, depending on
  292. the bandwidth mode chosen, and the asked-for width of the allocated planes.
  293.  
  294. We should explain why, a bit.  First, due to fetch-alignment restrictions,
  295. we may need a higher granularity (BytesPerRow a multiple of 4 or 8, instead
  296. of just 2 under ECS).  Second, BytesPerRow actually means two different
  297. things, which have always been identical, but aren't any more when
  298. using interleaved bitmaps.
  299.  
  300. BytesPerRow officially means "the number of bytes you have to add to a
  301. pointer to a byte of the BitMap to get to the same place one row
  302. down".  It no longer can be depended on to mean "the number of bytes
  303. in this row".  For interleaved bitmaps, BytesPerRow is quite a bit larger
  304. than the number of bytes in this row.  GetBitMapAttr( bm, BMA_WIDTH ) can
  305. return the true width in pixels.
  306.  
  307. * Improper checking for PAL vs. NTSC:
  308.  
  309. Software which uses release 2.0 (V36) or greater of the OS should NEVER use
  310. GfxBase->DisplayFlags to determine whether the machine is running in PAL or
  311. NTSC.  GfxBase->DisplayFlags is obsolete and may not accurately reflect the
  312. desired mode of the user.
  313.  
  314. WRONG-
  315.  
  316. BOOL IsPAL;
  317.  
  318. IsPAL=(GfxBase->DisplayFlags & PAL) ? TRUE : FALSE;
  319.  
  320.  
  321.  
  322. Instead, the modeID of the default public screen (or the default monitor,
  323. if the default public screen is set to something other than PAL or NTSC
  324. (like VGA)) should be checked.
  325.  
  326. Correct-
  327.  
  328. Bool IsPAL;
  329. struct Screen *screen;
  330. ULONG modeID = LORES_KEY;
  331. struct DisplayInfo displayinfo;
  332.  
  333. if (screen = LockPubScreen(NULL))
  334. {
  335.     if ((modeID = GetVPModeID(&(screen->ViewPort))) != INVALID_ID)
  336.     {
  337.         if (!((modeID & MONITOR_ID_MASK) == NTSC_MONITOR_ID || 
  338.               (modeID & MONITOR_ID_MASK) == PAL_MONITOR_ID))
  339.           modeID = LORES_KEY;
  340.     }
  341.  
  342.     UnlockPubScreen(NULL,screen);
  343. }
  344.  
  345. if (GetDisplayInfoData(NULL, (UBYTE *) &displayinfo,sizeof(struct DisplayInfo),DTAG_DISP,modeID))
  346. {
  347.     if (displayinfo.PropertyFlags & DIPF_IS_PAL)
  348.         IsPAL = TRUE;
  349.     else
  350.         IsPAL = FALSE;
  351. }
  352.  
  353.  
  354. 39.82 NOTE:
  355. If the display mode of the default public screen is double-PAL, DIPF_IS_PAL
  356. is not yet set.  This will be fixed.  Note that if the display mode of
  357. the default public screen is "default", and the machine is PAL, and
  358. promotion is on, then the default monitor is double-PAL, and the same
  359. applies.  Again, we expect to set DIPF_IS_PAL for modes of the double-PAL
  360. monitor.
  361.  
  362.  
  363.  
  364. * Incorrect assumptions about ColorMaps & ColorTables:
  365.  
  366. Because the color system undergoes significant changes, ColorMaps should
  367. always be allocated using GetColorMap(); freed using FreeColorMap(); colors
  368. changed using LoadRGB4(), SetRGB4(), or SetRGB4CM(); and colors queried
  369. using GetRGB4().  Specifically, the value ColorMap->ColorTable and the
  370. structure pointed to by it should never be poked or read directly. 
  371. Unfortunately, the old IFF sample code does NOT call the proper system
  372. functions, and instead reads ColorMap->ColorTable directly - This is
  373. incorrect, and code based on the original IFF sample code should be checked
  374. and changed.  The new IFF code (NewIFF.lzh, latest version available
  375. in BIX amiga.cert/com/dev listings, sent to ADSP, sent to Fred Fish)
  376. has been updated to never access the ColorMap->ColorTable directly.
  377.  
  378. New V39 functions for getting, setting, and loading color registers
  379. are provided.  These new functions treat color guns (R, G, B)
  380. each as 32-bit values for handling both 8-bit guns and any
  381. conceivable future needs.  Use these new 32-bit color functions
  382. when running under at least V39 for future compatibility.
  383.  
  384. When using 4 or 8-bit R/G/B values, scale your values to 32 bits by
  385. duplicating your 8 bit value in all 4 bytes of the 32 bit value.
  386. When scaling up a 4 bit value, duplicate it in all nibbles.
  387. e.g.:     8-bit red value $1F becomes $1F1F1F1F;
  388.     4-bit red value $3  becomes $33333333;
  389.  
  390.  
  391. Important note about NUMBER OF COLORS:  Older IFF code (even earlier
  392. newiff code) would not load more than 32 color registers.  The
  393. new code has been updated to base its upper limit for color loading
  394. on the ColorMap->Count of the ViewPort of the destination display.
  395. Remove old limitations of 32 registers in your code, and replace
  396. by limiting to ColorMap->Count registers.
  397.  
  398.  
  399. The release 2.0 graphics.library VideoControl() function should be used to
  400. get, set, or clear the special features associated with ColorMaps.
  401.  
  402.  
  403. * Poking Copper lists and/or Copinit:
  404.  
  405. The structure and order of Copper lists will change for all modes, so any
  406. program that relies on poking the Copper lists will likely break.  Certain
  407. programs (especially games) make assumptions about copinit and poke it
  408. directly -- These programs will break with the new chips.
  409.  
  410.  
  411. * Dangerous Bits in display hardware:
  412.  
  413. Beware of poking the following bits -
  414.  
  415. In BPLCON0: bits 0, 4, 5, 6, and 7
  416.  
  417. In BPLCON2: bits 7, 8, 9
  418.  
  419. In BPLCON3: bits 0,1,6,7, and bits 9 through 15
  420.  
  421.  
  422. * Illegal use of the processor to write to BitPlane and Sprite data
  423. registers
  424.  
  425.     BitPlane and Sprite data registers should NOT be written to by the
  426. processor.  The correct way for data to be fed to the chips is by setting
  427. up DMA that points to the data in CHIP memory.
  428.  
  429.  
  430. * Illegal re-use of sprites on the same line
  431.  
  432.     Attempting to re-use sprites on the same horizontal line by redefining
  433. the sprite data is illegal and unsupported.  Sprites may only be re-used
  434. vertically -- and then only with at least a one line gap between re-uses. 
  435. See the "Amiga Hardware Reference Manual" for an example of sprite re-use.
  436.  
  437.  
  438. * Incorrect allocation of sprite Image Data:
  439.  
  440.     Because of the increased fetch bandwidth of the new chips, sprite image
  441. data must be properly aligned in CHIP memory.  Under 2.0, the best way to
  442. allocate this memory is to call the exec.library AllocMem() function.
  443.  
  444.  
  445. * Forgotten FreeSprite():
  446.  
  447.     Sprites may now have a number of different modes.  However, under
  448. Intuition, these modes are global to all sprites.  If a program gets a
  449. sprite in a particular mode, but then does not free it, Intuition (and all
  450. intuition based programs, including workbench) are forced to use sprites in
  451. the mode of the forgotten sprite.  In general, it is good practice to not
  452. use sprites other than the pointer when coding software that is meant to be
  453. Intuition compatible.
  454.  
  455.  
  456. Taking Advantage of New Features
  457.  
  458.     Obviously, new versions of the system software will take advantage
  459. of these new chips.  But even without new system software, here are some
  460. strategies which should allow code to "automagically" take advantage of
  461. some of the new software's features.
  462.  
  463.  
  464. Previously impossible deeper modes:
  465.  
  466.     Properly written software can use the calling syntax of the current
  467. graphics.library and intuition.library functions to open the ECS screen
  468. modes with larger numbers of bitplanes.  These modes are simply deeper
  469. bitplane versions of existing modes -- lores 6,7, and 8 bits; hires 5,6,7,
  470. and 8 bits; super-hires 3,4,5,6,7, and 8 bits; and VGA 3,4,5,6,7, and 8
  471. bits.  Obviously, the Display Database must be checked to see if these
  472. modes support the desired number of bitplanes before actually trying to use
  473. them.
  474.  
  475.     Intuition's screen functions should be used to open these previously
  476. impossible screens, but programs cannot rely on Intuition to throw out all
  477. "bad" possibilities.  For example, V36 Intuition will open an 8 bit lores
  478. screen, and the 3 high bits simply go unused.  Programs will therefore need
  479. to explicitly check the display database to find out what the chips support.
  480.  
  481. 39.82 NOTE: Note that starting with this release, Intuition will fail to
  482. open a screen which is "too deep".  There is a new SA_ErrorCode value,
  483. OSERR_TOODEEP.
  484.  
  485. NOTE: The currently defined Display Database ModeIDs have all been
  486. moved to the new include file: graphics/modeid.h and .i
  487. Do NOT use homebrew modeid's created by OR'ing together monitors
  488. and modes.  Use only defined modes or modes listed as available
  489. in the display database (see AmigaMail, Devcon code, 2.0 RKM Libraries
  490. manual, following example, and new screen mode requester example).
  491.  
  492.     Given enough chip RAM, this complete example (release 2.0 or greater)
  493. will check the display database entry for a LORES screen and open a screen
  494. with the maximum allowable number of bitplanes.  On an Amiga with any
  495. chipset up to and including ECS, this code will open a 5 bitplane screen. 
  496. On a machine with the next generation chipset, the screen will be 8 bits
  497. deep.  The code will then draw one vertical line for each available color,
  498. using Intuition's "preferred" palette (which is presumably set by the user
  499. using preferences.)
  500.  
  501.  
  502. /*
  503.  * maxdepthlores.c
  504.  */
  505.  
  506. #include <intuition/intuition.h>
  507. #include <graphics/gfxbase.h>
  508. #include <graphics/displayinfo.h>
  509. #include <intuition/screens.h>
  510.  
  511. #include <clib/exec_protos.h>
  512. #include <clib/intuition_protos.h>
  513. #include <clib/graphics_protos.h>
  514.  
  515. #include <stdio.h>
  516. #include <stdlib.h>
  517.  
  518. struct IntuitionBase *IntuitionBase;
  519. struct GfxBase *GfxBase;
  520. extern struct ExecBase *SysBase;
  521.  
  522.  
  523. void Quit(char whytext[],UBYTE failcode)
  524. {
  525.     if (IntuitionBase) CloseLibrary((struct Library *) IntuitionBase);
  526.  
  527.     if (GfxBase) CloseLibrary((struct Library *) GfxBase);
  528.  
  529.     printf("%s\n",whytext);
  530.  
  531.     Delay(50*10);
  532.     
  533.     exit(failcode);
  534. }
  535.  
  536. void main(void)
  537. {
  538.     ULONG modeID = LORES_KEY;
  539.     DisplayInfoHandle displayhandle;
  540.     struct DimensionInfo dimensioninfo;
  541.  
  542.     UWORD maxdepth, maxcolors;
  543.  
  544.     ULONG soerror = NULL,colornum;
  545.  
  546.     struct Screen *screen;
  547.  
  548.     if ((GfxBase=
  549.     (struct GfxBase *) OpenLibrary("graphics.library",36))==NULL)
  550.         Quit("graphics.library is too old <V36",25);
  551.  
  552.     if ((IntuitionBase=
  553.     (struct IntuitionBase *) OpenLibrary("intuition.library",36))==NULL)
  554.         Quit("intuition.library is too old <V36",25);
  555.  
  556.     if ((displayhandle=FindDisplayInfo(modeID))==NULL)
  557.         Quit("modeID not found in display database",25);
  558.  
  559.     if (GetDisplayInfoData(displayhandle,(UBYTE *) &dimensioninfo,
  560.     sizeof(struct DimensionInfo),DTAG_DIMS,NULL)==0)
  561.         Quit("mode dimension info not available",25);
  562.         
  563.     maxdepth=dimensioninfo.MaxDepth;
  564.     printf("dimensioninfo.MaxDepth=%d\n",(int) maxdepth);
  565.  
  566.  
  567.     if (screen=OpenScreenTags(NULL,SA_DisplayID    ,modeID,
  568.                                  SA_Depth        ,(UBYTE) maxdepth,
  569.                                  SA_Title        ,"MaxDepth LORES",
  570.                                  SA_ErrorCode    ,&soerror,
  571.                                  SA_FullPalette    ,TRUE,
  572.                                  TAG_END))
  573.         {
  574.             /* Zowee! we actually got the screen open!
  575.              *
  576.              * now let's try drawing into it.
  577.              */
  578.             
  579.             maxcolors=1<<maxdepth;
  580.             
  581.             printf("maxcolors=%d\n",(int) maxcolors);
  582.             
  583.             for(colornum=0;colornum<maxcolors;++colornum)
  584.             {
  585.                 SetAPen(&(screen->RastPort),colornum);
  586.                 Move(&(screen->RastPort),colornum,screen->BarHeight + 2);
  587.                 Draw(&(screen->RastPort),colornum,199);
  588.             }
  589.             
  590.             Delay(50*1*6);
  591.  
  592.             CloseScreen(screen);
  593.         }
  594.             
  595.     else
  596.         {
  597.             /*
  598.              * Hmmm.  Couldn't open the screen.  maybe not
  599.              * enough CHIP RAM? Maybe not enough chips! ;-)
  600.              */
  601.             
  602.             switch(soerror)
  603.             {
  604.                 case OSERR_NOCHIPS:
  605.                     Quit("Bummer! You need new chips dude!",25);
  606.                     break;
  607.                 
  608.                 case OSERR_UNKNOWNMODE:
  609.                     Quit("Bummer! Unknown screen mode.",25);
  610.                     break;
  611.                 
  612.                 case OSERR_NOCHIPMEM:
  613.                     Quit("Not enough CHIP memory.",25);
  614.                     break;
  615.                 
  616.                 case OSERR_NOMEM:
  617.                     Quit("Not enough FAST memory.",25);
  618.                     break;
  619.                 
  620.                 default:
  621.                     printf("soerror=%d\n",soerror);
  622.                     Quit("Screen opening error.",25);
  623.                     break;
  624.             }
  625.             
  626.             Quit("Couldn't open screen.",25);
  627.         }
  628. }
  629.  
  630.  
  631. Opening on Workbench:
  632.  
  633.     One of the easiest ways to help a given program peacefully coexist with
  634. new hardware is to allow it to open on the Workbench screen  (or on any
  635. public screen).  Software written in such a way that it can operate on any
  636. of 2.0's myriad possible Workbench screens should be robust enough that it
  637. can find out from the system any information it might need about the
  638. environment, and (if it understands the kind of screen that it's on) use
  639. the appropriate graphics.library calls to manipulate it's window.
  640.  
  641.     Here's some example code that determines the depth of the default
  642. public screen and opens a window on it.  If it where a real application,
  643. the code now has a good idea of how many colors are available on the screen
  644.  
  645. /* depthawarevisitor.c */
  646.  
  647. #include <intuition/intuition.h>
  648. #include <graphics/gfxbase.h>
  649. #include <graphics/displayinfo.h>
  650. #include <intuition/screens.h>
  651.  
  652. #include <clib/exec_protos.h>
  653. #include <clib/intuition_protos.h>
  654. #include <clib/graphics_protos.h>
  655.  
  656. #include <stdio.h>
  657. #include <stdlib.h>
  658.  
  659.  
  660. struct IntuitionBase *IntuitionBase;
  661. struct GfxBase *GfxBase;
  662. extern struct ExecBase *SysBase;
  663.  
  664. void Quit(char whytext[],UBYTE failcode)
  665. {
  666.     if (IntuitionBase) CloseLibrary((struct Library *) IntuitionBase);
  667.  
  668.     if (GfxBase) CloseLibrary((struct Library *) GfxBase);
  669.  
  670.     printf("%s\n",whytext);
  671.  
  672.     Delay(50*10);
  673.     
  674.     exit(failcode);
  675. }
  676.  
  677. void main(void)
  678. {
  679.     struct Screen *screen;
  680.     struct DrawInfo *drawinfo;
  681.     struct Window *window;
  682.  
  683.     UWORD depth;
  684.  
  685.  
  686.     if ((GfxBase=
  687.     (struct GfxBase *) OpenLibrary("graphics.library",36))==NULL)
  688.         Quit("graphics.library is too old <V36",25);
  689.  
  690.     if ((IntuitionBase=
  691.     (struct IntuitionBase *) OpenLibrary("intuition.library",36))==NULL)
  692.         Quit("intuition.library is too old <V36",25);
  693.  
  694.  
  695.     if (!(screen = LockPubScreen(NULL)))
  696.         Quit("Miserably",25);
  697.  
  698.     /* Here's where we'll ask Intuition about the screen. */
  699.     drawinfo=GetScreenDrawInfo(screen);
  700.  
  701.     depth=drawinfo->dri_Depth;
  702.  
  703.     /* Because Intuition allocates the DrawInfo structure,
  704.      * we have to tell it when we're done, to get the memory back.
  705.      */
  706.     FreeScreenDrawInfo(screen, drawinfo);
  707.  
  708.     /* This next line takes advantage of the stack-based amiga.lib
  709.      * version of OpenWindowTags.
  710.      */
  711.     if (window = OpenWindowTags(NULL,    WA_PubScreen    ,screen,
  712.                                 WA_Left        ,0,
  713.                                 WA_Width    ,screen->Width,
  714.                                 WA_Top        ,screen->BarHeight,
  715.                                 WA_Height,
  716.                                 screen->Height - screen->BarHeight,
  717.                                 WA_Flags,
  718. WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|ACTIVATE|SIMPLE_REFRESH|NOCAREREFRESH,
  719.                                 WA_Title    ,"Big Visitor",
  720.                                 TAG_END))
  721.     {
  722.         /* because we're a visitor, we can unlock the screen as soon
  723.          * as the window is open
  724.          */
  725.         UnlockPubScreen(NULL,screen);
  726.  
  727.         printf("depth=%d\n",depth);
  728.         
  729.         /* All our window event handling might go here */
  730.  
  731.         Delay(50*10);
  732.  
  733.         /* Of course, some other program might come along
  734.          * and change the attributes of the screen that we read from
  735.          * DrawInfo, but that's a mean thing to do to a public screen,
  736.          * so let's hope it doesn't happen.
  737.          */
  738.  
  739.         CloseWindow(window);
  740.     }
  741.     else UnlockPubScreen(NULL,screen); /* OpenWindow failed, but we still have
  742.                                   * to let go of the screen.
  743.                                   */
  744. }
  745.  
  746.  
  747. Direct Hardware Access:
  748.  
  749.     So many of the internal mechanisms (especially those dealing with
  750. color) are changing, that developers who insist on directly hitting the
  751. hardware have no real way of writing software today which will even run
  752. with, let alone take advantage of, tomorrow's chips.
  753.  
  754.  
  755. What to Expect From New OS Software
  756.  
  757. Graphics.library:
  758.  
  759.     Graphics.library enhanced to handle the capabilities offered
  760. by the new chips.
  761.  
  762.     Allocation Issues - New functions to properly initialize and allocate
  763. structures (like BitMaps and planes) which can take advantage of the chips'
  764. new modes.
  765.  
  766.     Color Palette Handling - The new chips will handle color in new and
  767. different ways.  A number of new software features deal with this new color
  768. scheme.
  769.  
  770.     "RGB" functions - New versions of the "RGB" functions (Set, Load, Get,
  771. etc.) which will handle the structure of the new Color Table.
  772.  
  773.     Palette sharing - Shared or exclusive access to colors in the current
  774. colormap.
  775.  
  776.     Display Database - The functionality of the Display Database
  777. increased to provide applications with even more detailed information
  778. about available modes.
  779.  
  780.     Get and Set Functions - Because of the number of changes and
  781. extensions to system structures related to graphics, new functions will
  782. allow the safe manipulation of these structures.
  783.  
  784.     Sprite Handling - New methods of allocating and generating acceptable
  785. sprite image data will be provided.
  786.  
  787.  
  788. Intuition.library:
  789.  
  790.     Intuition enhanced to take advantage of the new graphics abilities.
  791.  
  792.  
  793.  
  794. Table 1:  New Modes (In Addition to Modes Supported by ECS)
  795.  
  796.  
  797. Mode            Planes    Colors                    Bandwidth (See note 1)
  798. ----            ------    ------                    ----------------------
  799. LORES (320x200)    6        64                        1
  800.                 7        128                        1
  801.                 8        256                        1
  802.                 8        HAM    256,000+ (see note 2)    1
  803.  
  804. HIRES (640x200)    5        32                        2
  805.                 6        EHB    64 (see note 3)        2
  806.                 6        HAM    4096 (see note 4)    2
  807.                 6        64                        2
  808.                 7        128                        2
  809.                 8        256                        2
  810.                 8        HAM    256,000+ (see note 2)    2
  811.  
  812. SUPERHIRES (1280x200)
  813.                 1        2 (see note 5)            1
  814.                 2        4 (see note 5)            1
  815.                 3        8                        2
  816.                 4        16                        2
  817.                 5        32                        4
  818.                 6        EHB    64 (see note 3)        4
  819.                 6        HAM    4096 (see note 4)    4
  820.                 6        64                        4
  821.                 7        128                        4
  822.                 8        256                        4
  823.                 8         HAM    256,000+ (see note 2)    4
  824.  
  825. VGA  (160,320,640x480 non-int.)
  826.                 1        2 (see note 5)            1
  827.                 2        4 (see note 5)            1
  828.                 3        8                        2
  829.                 4        16                        2
  830.                 5        32                        4
  831.                 6         EHB    64 (see note 3)        4
  832.                 6         HAM    4096 (see note 4)    4
  833.                 6        64                        4
  834.                 7        128                        4
  835.                 8        256                        4
  836.                 8         HAM    256,000+ (see note 2)    4
  837.  
  838. Notes:
  839. 1 - The "Bandwidth" number describes the amount of fetch bandwidth required
  840. by a particular screen mode.  For example, a 5 bit deep VGA screen requires
  841. the 4x bandwidth fetch mode while a 1 bit VGA screen requires only the 1x
  842. mode..  This translates to the hardware having to move data 4 times faster.
  843. To be able to move data at these higher rates, the higher bandwidth modes
  844. require data to be properly aligned in CHIP memory that is fast enough to
  845. support the bandwidth.  Specifically, bandwidth fetch mode factors of 1
  846. require data to be on 16 bit boundaries, factors of 2 require 32 bit
  847. boundaries, and factors of 4 require 64 bit boundaries.  Restrictions like
  848. these are the best reason to use the system allocation functions whenever
  849. data is being prepared for the custom hardware.  It is not guaranteed that
  850. all machines that have the new chipset will also have memory fast enough
  851. for the 4x modes.  Therefore, the ONLY way to know whether or not the
  852. machine will support the mode you want is to check the Display Database.
  853.  
  854. 2 - New 8 bit HAM mode uses the upper 6 bits for 64 24-bit base register
  855. colors or as a 6 bit modify value, plus the lower 2 bits for 18 bit hold or
  856. modify mode control.  This mode could conceivably allow simultaneous
  857. display of more than 256,000 colors (up to 16.8 million, presuming a
  858. monitor / screenmode with enough pixels.)  Please note that while the
  859. register planes and control planes are internally reversed in 8 bit HAM
  860. (the control bits are the two LSBs instead of the two MSBs),  programs
  861. using graphics.library and intuition.library will not have to deal with
  862. this reversal, as it will be handled automatically for them.
  863.  
  864. 3 - This is like the original EHB mode, but in new resolutions.  It uses 5
  865. bits to yield 32 register colors, plus a sixth bit for 32 colors that are
  866. 1/2 as bright.
  867.  
  868. 4 - This is like the original 6 bit Ham mode, but in new resolutions.  It
  869. uses the lower 4 bits for 16 register colors, plus the upper 2 bits for
  870. modify mode control.  This mode allows  simultaneous display of 4096
  871. colors.
  872.  
  873. 5 - These modes are unlike the old VGA and SUPERHIRES modes in that they
  874. are not restricted to a nonstandard 64 color palette.
  875.  
  876.    (( <./\.| )) The 7th <hurch of the /\pocalyptic |awnmower! (( <./\.| ))   
  877. -+*$> ANTHROX UNITED KINGDOM/LONDON HEADQUARTERS: +44-81-459-4243 [AMI] <$*+-
  878.    (( <./\.| )) The 7th <hurch of the /\pocalyptic |awnmower! (( <./\.| ))   
  879. AACHIP.TXT UPLOADED TO <./\.| BBS By Mr.P0T-NOoDLE At WHENEVER
  880.  
  881.  +-------------------------------------------------------------------------+
  882.  |                     THIS FILE HAS BEEN UPLOADED TO                      |
  883.  |                      *-== UNKNOWN  PLEASURES ==-*                       |
  884.  |                 ALLIANCE WORLD HEADQUARTERS = 0204 29917                |
  885.  |                16.8 USR Dual Standard / Latest Warez FAST!              |
  886.  +-------------------------------------------------------------------------+
  887.